import logging

from django.db.models import Q
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework import viewsets
from rest_framework.decorators import action

from BYD_ERP.utils.base_views import MultipleDestroyMixin, MultipleOpenMixin
from BYD_ERP.utils.pagination import GlobalPagination
from goods_info.models import GoodsModel, GoodsInventoryModel
from goods_info.serializer.goods_serializer import GoodsBaseSerializer, GoodsGetSerializer

logger = logging.getLogger('my')


class GoodsView(viewsets.ModelViewSet, MultipleDestroyMixin, MultipleOpenMixin):
    """
        create:
        货品（存货档案）信息--新增，注意：images_list="1,2,3,4"；里面是附件的ID

        货品（存货档案）信息新增，status：201（成功），return：新增货品（存货档案）信息

        destroy:
        货品（存货档案）信息--删除

        货品（存货档案）信息删除，status：204（成功），return：None

        multiple_delete:
        货品（存货档案）信息--批量删除，必传参数：ids=[1,2,3,4……]

        货品（存货档案）信息批量删除，status：204（成功），return：None

        multiple_open:
        货品（存货档案）信息--批量启用或者禁用，必传（json）参数：ids=[1,2,3,4……]（列表中可以只有一个参数），is_open=1/0

        {
            "ids": [1,2],
            "is_open": "0"
        }
        is_open=1表示禁用，is_open=0表示启用
        货品（存货档案）信息批量启用或者禁用，status：204（成功），return：None

        update:
        货品（存货档案）信息--修改

        货品（存货档案）信息修改，status：200（成功），return：修改后的货品（存货档案）信息

        partial_update:
        货品（存货档案）信息--局部修改，可以传任意属性的值，服务器会修改指定的属性值

        货品（存货档案）信息局部修改，status：200（成功），return：修改后的货品（存货档案）信息

        list: 查询所有的顶级类别
        货品（存货档案）信息--获取分页列表，可选get请求参数：pid，如果没有传则查询顶级类别，否则查询指定pid下的子类别

        货品（存货档案）信息列表信息，status：200（成功），return：货品（存货档案）信息列表

        retrieve:
        查询某一个货品（存货档案）信息

        查询指定ID的货品（存货档案）信息，status：200（成功），return：指定货品（存货档案）信息
    """
    queryset = GoodsModel.objects.all()
    serializer_class = GoodsBaseSerializer
    pagination_class = GlobalPagination

    def get_serializer_class(self):
        # retrieve查单个商品信息
        if self.action == 'find' or self.action == 'retrieve':
            return GoodsGetSerializer
        return GoodsBaseSerializer

    def get_queryset(self):
        if self.action == 'find':  # 过滤查询
            # 获取请求参数（在json中）：
            keyword = self.request.data.get('keyword', None)  # 名称/件号/型号
            partner = self.request.data.get('partner', None)  # 厂家/客户
            basic_weight = self.request.data.get('basic_weight', None)
            delete_flag = self.request.data.get('delete_flag', None)
            goods_category = self.request.data.get('goods_category', 0)

            query = Q()
            if keyword:
                child_query = Q()
                child_query.add(Q(name__contains=keyword), 'OR')
                child_query.add(Q(specification__contains=keyword), 'OR')
                child_query.add(Q(model_number__contains=keyword), 'OR')
                query.add(child_query, 'AND')
            if partner:
                query.add(Q(partner__contains=partner), 'AND')
            if basic_weight:
                query.add(Q(basic_weight=basic_weight), 'AND')
            if goods_category:
                query.add(Q(goods_category=goods_category), 'AND')
            if delete_flag:
                query.add(Q(delete_flag=delete_flag), 'AND')
            return GoodsModel.objects.filter(query).all()
        else:
            return GoodsModel.objects.all()

    params = openapi.Schema(type=openapi.TYPE_OBJECT, properties={
        'keyword': openapi.Schema(type=openapi.TYPE_STRING, description="名称/件号/型号的关键字"),
        'partner': openapi.Schema(type=openapi.TYPE_STRING, description="厂家"),
        'basic_weight': openapi.Schema(type=openapi.TYPE_STRING, description="基础重量"),
        'delete_flag': openapi.Schema(type=openapi.TYPE_STRING, description="状态0或者1"),
        'goods_category': openapi.Schema(type=openapi.TYPE_STRING, description="货品类别的ID"),
    })

    # 分页参数必须是query_param
    page_param = openapi.Parameter(name='page', in_=openapi.IN_QUERY, description="页号", type=openapi.TYPE_STRING)
    size_param = openapi.Parameter(name='page_size_user_defined', in_=openapi.IN_QUERY, description="每页显示的数量", type=openapi.TYPE_STRING)

    @swagger_auto_schema(method='post', request_body=params, manual_parameters=[page_param, size_param],
                         operation_description="商品搜索过滤")
    @action(methods=['post'], detail=False)
    def find(self, request, *args, **kwargs):
        return super(GoodsView, self).list(request=request, *args, **kwargs)

    pass
